package com.example.demo.config;


import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

import java.util.HashMap;


// 统⼀的数据返回格式可以使⽤ @ControllerAdvice + ResponseBodyAdvice 的⽅式实现。
// 类上加 @ControllerAdvice 。
// 并且，该类实现 ResponseBodyAdvice 接口。
// 必须重写 里面的 supports 和 beforeBodyWrite 方法。
// supports（支持）：当它返回 true，就表示要对 返回的数据，进行 格式的重写。反之，当它返回 false，就不需要重写了。
// 当需要 到 重写，就会进入 beforeBodyWrite 方法。
// beforeBodyWrite 方法的意义：就是将数据返回之前，要不要进行重写 响应数据。
// 统一返回格式
@ControllerAdvice
public class MyResponseAdvice implements ResponseBodyAdvice {

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
//        return false;
        //默认返回false 表示在进行返回数据之前 不进行重写
        //只有返回true的时候 才会进行重写 进入到beforeBodyWrite方法中

        return true;
    }


    @Override
    public Object beforeBodyWrite(Object body,// 返回原始数据
                                  MethodParameter returnType,// 原始数据返回类型
                                  MediaType selectedContentType,// 可以获取到他的媒体类型
                                  Class selectedConverterType,// 当前的类是哪个类
                                  ServerHttpRequest request,// 请求 响应
                                  ServerHttpResponse response) {
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("state", 1);
        hashMap.put("data", body);
        hashMap.put("msg", "");
        return hashMap;
    }
}
